/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import database.DBConnection;
import java.io.IOException;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import util.PropertiesManager;

/**
 *
 * @author rosana
 */
public class CompromissoDAO implements OperacoesDAO {
    
     private Connection conexao;

    public CompromissoDAO() throws ClassNotFoundException, SQLException {
        conexao = DBConnection.getConnection();

    } 
      @Override
    public void inserir(Object obj) throws SQLException {
        String SQL = buscaSQL("insert.Compromisso");
        if (obj instanceof Compromisso) {
            Compromisso com = (Compromisso) obj;
            PreparedStatement st = conexao.prepareStatement(SQL);
            st.setString(1, com.getNome());
            st.setString(2, com.getData());
            st.setString(3, com.getHora());
            st.setString(4, com.getDescricao());
            st.setInt(5, com.getPaciente().getIdPessoa()); 
            st.setInt(6, com.getAgenda().getIdAgenda()); 
            st.setString(7, com.getCompareceu()); 
            st.setString(8, com.getValor()); 
            st.setString(9, com.getPagamento()); 
            st.execute();
            
        }
    }
       
        public int FunctionTotalConsultas(Object obj,Object obj1) throws SQLException {
            int n = 0;
            Compromisso com = (Compromisso) obj;
            Compromisso com2 = (Compromisso) obj1;
            CallableStatement cs = conexao.prepareCall("{?= call FUNC_TOTAL_CONSULTAS(?,?)}"); 
            cs.setString(2,com.getData());
            cs.setString(3,com2.getData());
            cs.registerOutParameter(1, OracleTypes.NUMBER); 
            cs.execute();
            n=cs.getInt(1);
            return n;
    }
         public int FunctionTotalConsultasNao(Object obj,Object obj1) throws SQLException {
            int n = 0;
            Compromisso com = (Compromisso) obj;
            Compromisso com2 = (Compromisso) obj1;
            CallableStatement cs = conexao.prepareCall("{?= call func_total_consultas_nao(?,?)}"); 
            cs.setString(2,com.getData());
            cs.setString(3,com2.getData());
            cs.registerOutParameter(1, OracleTypes.NUMBER); 
            cs.execute();
            n=cs.getInt(1);
            return n;
    }
       
        
        
    public String FunctionTotalAniversariantes(Object obj) throws SQLException {
            String n;
            Compromisso com = (Compromisso) obj;
            OracleCallableStatement  cs =(OracleCallableStatement) conexao.prepareCall("{?= call select * from table(func_pac_aniversario(?))}"); 
            cs.setString(2,com.getData());
            cs.registerOutParameter(1, OracleTypes.VARCHAR); 
            n= cs.getString(1);
            cs.execute();
            return n;
    }
    
     public int FunctionTotalPago(Object obj) throws SQLException {
            int n = 0;
            Compromisso com = (Compromisso) obj;
            CallableStatement cs = conexao.prepareCall("{?= call valor_total_pago (?)}"); 
            cs.setString(2,com.getData());
            cs.registerOutParameter(1, OracleTypes.NUMBER); 
            cs.execute();
            n=cs.getInt(1);
            return n;
    }
     public void FunctionCancelaMulta(Object obj) throws SQLException {
            Compromisso com = (Compromisso) obj;
            CallableStatement cs = conexao.prepareCall("{call proc_multa_canc (?,?)}"); 
            cs.setInt(1,com.getPaciente().getPessoa().getIdPessoa());
            cs.setString(2,com.getData());
            cs.execute();
    }
      public void FunctionNaoCompareceuConsulta(Object obj) throws SQLException {
            Compromisso com = (Compromisso) obj;
            CallableStatement cs = conexao.prepareCall("{call proc_multa_comparec (?,?)}"); 
            cs.setInt(1,com.getPaciente().getPessoa().getIdPessoa());
            cs.setString(2,com.getData());
            cs.execute();
    }
    public void FunctionPresenteNatal(Object obj,Object obj1) throws SQLException {
            Compromisso com = (Compromisso) obj;
            Compromisso com2 = (Compromisso) obj1;
            CallableStatement cs = conexao.prepareCall("{call proc_presente_natal (?,?,?)}"); 
            cs.setInt(1,com.getPaciente().getPessoa().getIdPessoa());
            cs.setInt(1,com2.getPaciente().getPessoa().getIdPessoa());
            cs.setString(2,com.getData());
            cs.setString(3,com2.getData());
            cs.execute();
    }
    
    
    @Override
    public boolean excluir(Object obj) throws SQLException {
        Integer num = (Integer) obj;
        int id = num.intValue();
        String sql = (String) buscaSQL("delete.Compromisso");
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, id);
        stmt.execute();
        stmt.close();
        return true;
    }

   @Override
    public void editar(Object obj) throws SQLException {
        Compromisso prof = (Compromisso) obj;
        String sql = (String) buscaSQL("Update.Compromisso");
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setString(1, prof.getNome());
        stmt.setString(2, prof.getData());
        stmt.setString(3, prof.getHora());
        stmt.setString(4, prof.getDescricao());
        stmt.setInt(5, prof.getPaciente().getPessoa().getIdPessoa());
        stmt.setString(6, prof.getCompareceu());
        stmt.setString(7, prof.getValor());
        stmt.setString(8, prof.getPagamento());
        stmt.setInt(9, prof.getIdCompromisso());
        stmt.execute();
        stmt.close();
    }
    
    
    @Override
    public ArrayList pesquisar() throws SQLException {
        ArrayList retorno = new ArrayList();
        String SQL = buscaSQL("selectAll.Compromisso");
        Statement st = conexao.createStatement();
        ResultSet res = st.executeQuery(SQL);
        while (res.next()) {
            int key = res.getInt(1);
            String nome = res.getString(2);
             String a = res.getString(3).substring(0, 4);
            String b = res.getString(3).substring(5, 7);
            String c = res.getString(3).substring(8, 10);
            String data = (c+"/"+b+"/"+a);
            String hora = res.getString(4);
            String descricao = res.getString(5);
            int paciente = res.getInt(6);
            int Agenda = res.getInt(7);
            String compareceu = res.getString(8);
            String valor = res.getString(9);
            String pagamento = res.getString(10);
            Pessoa pes = new Pessoa(paciente, null, null, null, null, null, null, null, null);
            Paciente pec = new Paciente(pes, 0, null, null, null, null, null, null, null, null, null, null, null);
            Compromisso com = new Compromisso(key, nome, descricao, data, hora, pec, null, compareceu,valor,pagamento);
            retorno.add(com);
        }
        return retorno;
    }
    
    public Compromisso pesquisarById(String chave) throws SQLException {
        Compromisso user = null;
    String SQL = buscaSQL("selectById.Compromisso");
        PreparedStatement st = conexao.prepareStatement(SQL);
        st.setString(1, chave);
        ResultSet res = st.executeQuery();
        while (res.next()) {
            int key = res.getInt(1);
            String nome = res.getString(2);
            String a = res.getString(3).substring(0, 4);
            String b = res.getString(3).substring(5, 7);
            String c = res.getString(3).substring(8, 10);
            String data = (c+"/"+b+"/"+a);
            String hora = res.getString(4);
            String descricao = res.getString(5);
            int paciente = res.getInt(6);
            int Agenda = res.getInt(7);
            String compareceu = res.getString(8);
            String pagamento = res.getString(9);
            String valor = res.getString(10);
            Pessoa pes = new Pessoa(paciente, null, null, null, null, null, null, null, null);
            Paciente pec = new Paciente(pes, 0, null, null, null, null, null, null, null, null, null, null, null);
           user = new Compromisso(key, nome, descricao, data, hora, pec, null, compareceu,valor,pagamento);
        }
        return user;
    }
    
    
    
    public ArrayList pesquisarRelatorioConsulta() throws SQLException {
     ArrayList retorno = new ArrayList();
    String SQL = buscaSQL("selectRelatorioConsultaHistorio");
        PreparedStatement st = conexao.prepareStatement(SQL);
        ResultSet res = st.executeQuery();
        while (res.next()) {
            int key = res.getInt(1);
            String nome = res.getString(2);
            String a = res.getString(3).substring(0, 4);
            String b = res.getString(3).substring(5, 7);
            String c = res.getString(3).substring(8, 10);
            String data = (c+"/"+b+"/"+a);
            String hora = res.getString(4);
            String descricao = res.getString(5);
            int paciente = res.getInt(6);
            int Agenda = res.getInt(7);
            String compareceu = res.getString(8);
            String pagamento = res.getString(9);
            String valor = res.getString(10);
            String nomePaciente = res.getString(11);
            Pessoa pes = new Pessoa(paciente, nomePaciente, null, null, null, null, null, null, null);
            Paciente pec = new Paciente(pes, 0, null, null, null, null, null, null, null, null, null, null, null);
           Compromisso com = new Compromisso(key, nome, descricao, data, hora, pec, null, compareceu,valor,pagamento);
           retorno.add(com);
        }
        return retorno;
    }
    public ArrayList pesquisarCompromisso() throws SQLException {
        ArrayList retorno = new ArrayList();
        String SQL = buscaSQL("selectPesquisarCompromisso");
        Statement st = conexao.createStatement();
        ResultSet res = st.executeQuery(SQL);
        while (res.next()) {
            int key = res.getInt(1);
            String nome = res.getString(2);
            String a = res.getString(3).substring(0, 4);
            String b = res.getString(3).substring(5, 7);
            String c = res.getString(3).substring(8, 10);
            String data = (c+"/"+b+"/"+a);
            String hora = res.getString(4);
            String descricao = res.getString(5);
            int paciente = res.getInt(6);
            int agenda = res.getInt(7);
            String compareceu = res.getString(8);
            String valor = res.getString(9);
            String pagamento = res.getString(10);
            String nomepaciente = res.getString(11);
            Agenda agen = new Agenda(agenda, null, null, null, null, null, null, null, null, null);
            Pessoa pes = new Pessoa(paciente, nomepaciente, null, null, null, null, null, null, null);
            Paciente pac = new Paciente(pes, 0, null, null, null, null, null, null, null, null, null, null, null);
            Compromisso com = new Compromisso(key, nome, descricao, data, hora,pac,agen,compareceu,valor,pagamento);
            retorno.add(com);
        }
        return retorno;
    }
    
    
     private String buscaSQL(String chave) {
        String sql = null;
        try {
            PropertiesManager pm = new PropertiesManager("sql.properties");
            HashMap dados = pm.readPropertiesFile();
            sql = (String) dados.get(chave);
        } catch (IOException ex) {
            Logger.getLogger(CompromissoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sql;
    }
       
}
